#include <mips/regdef.h>

	.file	1 "generic/estimar.c"
	.section .mdebug.abi32
	.previous
	.abicalls
	.text
	.align	2
	.globl	estimar
	.ent	estimar
estimar:

	/// PROLOGO, se prepara el STACK
	/// STACK
	/// se salvan siete registros enteros (fp, gp, s0, s1, s2, s3 y ra, 28 bytes + 4 bytes de padding = 32 bytes)
	/// no hay registros de punto flotante que salvar (0 bytes)
	/// no hay area de variables locales (0 bytes)
	/// area de argument building, para pasar 4 arguments (16 bytes)
	/// TOTAL: 48 bytes

	/// variables
	/// s0 = m
	/// s1 = n
	/// s2 = resultado
	/// s3 = estimador

	subu	sp, sp, 0x30
	
	// padding 0x2c(sp)
	sw	ra, 0x28(sp)
	
	sw	$fp, 0x24(sp)
	sw	gp, 0x20(sp)
	
	sw	s0, 0x1c(sp)
	sw	s1, 0x18(sp)
	
	sw	s2, 0x14(sp)
	sw	s3, 0x10(sp)
	
	// cuarto argumento 0xc(sp)	// NOTA: de todas maneras, como las funciones que se van a llamar
	// tercer argumento 0x8(sp)	// reciben solo 4 argumentos, cuando se llamen se usaran los registros
	// segundo argumento 0x4(sp)	// a0 al a3 para pasar los argumentos
	// primer argumento 0(sp)
	

	move	$fp, sp

	move	s4, a3	// puntero a la funcion estimador

	/// preparar los argumentos para llamar al estimador
	/// a0 y a1 son los mismos (m y n)
	/// a2 debe ser la columna
	/// a3 es el resultado

	move	s0, a0
	move	s1, a1
	move	s2, zero
	move	s3, a2


$L2:
	move	a0, s0
	move	a1, s1
	move	a2, s2
	move	a3, s3

	move	t9, s4		// al usar directamente s0 con jal, ocasiona un warning
	jal	ra, t9
	
	addiu	s2, s2, 1	// incrementar el numero de columna
	addiu	s3, s3, 4	// mover el puntero al resultado una posicion float (4 bytes)

	blt	s2, s1, $L2

	// los 16 bytes antes de s3 son del argument area, no hay nada que restaurar de ahi

	lw	s3, 0x10(sp)
	lw	s2, 0x14(sp)
	
	lw	s1, 0x18(sp)
	lw	s0, 0x1c(sp)
	
	lw	gp, 0x20(sp)
	lw	ra, 0x28(sp)
	
	lw	$fp, 0x24(sp)
	// padding 0x2c(sp)

	addu	sp, sp, 0x30
	j	ra

	.end	estimar
	.size	estimar, .-estimar
	.ident	"GCC: (GNU) 3.3.3 (NetBSD nb3 20040520)"
